From f3ccc1264462cb6164a021dc21c43a2c81db1701 Mon Sep 17 00:00:00 2001 From: "djm@kirby.fc.hp.com" Date: Fri, 18 Nov 2005 10:58:03 -0600 Subject: [PATCH] Properly pass iha/itir if data miss occurs when fetching privop (by Matt Chapman) --- xen/arch/ia64/xen/process.c | 7 ++----- xen/arch/ia64/xen/vcpu.c | 2 ++ 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/xen/arch/ia64/xen/process.c b/xen/arch/ia64/xen/process.c index cfe91e4ef4..a8d5c96c15 100644 --- a/xen/arch/ia64/xen/process.c +++ b/xen/arch/ia64/xen/process.c @@ -698,13 +698,10 @@ ia64_handle_privop (unsigned long ifa, struct pt_regs *regs, unsigned long isr, IA64FAULT vector; struct domain *d = current->domain; struct vcpu *v = current; - // FIXME: no need to pass itir in to this routine as we need to - // compute the virtual itir anyway (based on domain's RR.ps) - // AND ACTUALLY reflect_interruption doesn't use it anyway! vector = priv_emulate(current,regs,isr); if (vector != IA64_NO_FAULT && vector != IA64_RFI_IN_PROGRESS) { - PSCB(current,itir) = - vcpu_get_itir_on_fault(v,PSCB(current,ifa)); + // Note: if a path results in a vector to reflect that requires + // iha/itir (e.g. vcpu_force_data_miss), they must be set there reflect_interruption(isr,regs,vector); } } diff --git a/xen/arch/ia64/xen/vcpu.c b/xen/arch/ia64/xen/vcpu.c index 363d426c7f..33969d0774 100644 --- a/xen/arch/ia64/xen/vcpu.c +++ b/xen/arch/ia64/xen/vcpu.c @@ -1186,6 +1186,8 @@ Privileged operation emulation routines IA64FAULT vcpu_force_data_miss(VCPU *vcpu, UINT64 ifa) { PSCB(vcpu,ifa) = ifa; + PSCB(vcpu,itir) = vcpu_get_itir_on_fault(vcpu,ifa); + vcpu_thash(current, ifa, &PSCB(current,iha)); return (vcpu_get_rr_ve(vcpu,ifa) ? IA64_DATA_TLB_VECTOR : IA64_ALT_DATA_TLB_VECTOR); } -- 2.30.2